package gob.pgr.ws;

import gob.pgr.dao.HibernateDao;
import gob.pgr.dto.PgrBitacoraConsulta;
import gob.pgr.dto.PgrConsultaCliente;
import gob.pgr.dto.PgrUsuario;
import gob.pgr.util.PGRUtil;

import java.util.Date;

import javax.jws.WebService;

import org.apache.commons.lang.StringUtils;

@WebService(serviceName = "WSSolvencia", endpointInterface = "gob.pgr.ws.WSSolvenciaService")
public class WSSolvencia implements WSSolvenciaService {
	private HibernateDao hibernateDao;

	public HibernateDao getHibernateDao() {
		return hibernateDao;
	}

	public void setHibernateDao(HibernateDao hibernateDao) {
		this.hibernateDao = hibernateDao;
	}

	@Override
	public String comprobarSolvenciaDui(String usuario, String clave, String dui) {
		SalidaSolvencia salida = new SalidaSolvencia();
		String codigoRetorno = "";
		String mensajeRetorno = "";
		String estado = null;
		PgrUsuario pgrUsuario = null;
		PgrConsultaCliente pgrConsultaCliente = null;
		try {
			usuario = StringUtils.upperCase(usuario);
			if (StringUtils.isBlank(usuario)) {
				codigoRetorno = "03";
				mensajeRetorno = "El campo usuario viene vac\u00edo";
			}
			else if (StringUtils.isBlank(clave)) {
				codigoRetorno = "04";
				mensajeRetorno = "El campo clave viene vac\u00edo";
			}
			else if (StringUtils.isBlank(dui)) {
				codigoRetorno = "05";
				mensajeRetorno = "El campo dui viene vac\u00edo";
			}
			else if (!StringUtils.isNumeric(dui)) {
				codigoRetorno = "06";
				mensajeRetorno = "El campo dui no es num\u00e9rico";
			}
			else if (!PGRUtil.validarDUI(dui)) {
				codigoRetorno = "07";
				mensajeRetorno = "El campo dui no cumple algoritmo de validaci\u00f3n";
			}
			else {
				pgrUsuario = getHibernateDao().obtenerUsuario(usuario);
				if (pgrUsuario == null) {
					codigoRetorno = "08";
					mensajeRetorno = "El usuario proporcionado no existe: " + usuario;
				}
				else if (StringUtils.equals("0", pgrUsuario.getPgrOrganizacion().getActivo())) {
					codigoRetorno = "09";
					mensajeRetorno = "La organizaci\u00f3n asociada al usuario no se encuentra activa: " + usuario + " (" + pgrUsuario.getPgrOrganizacion().getNombreOrganizacion() + ")";
				}
				else if (StringUtils.equals("0", pgrUsuario.getActivo())) {
					codigoRetorno = "10";
					mensajeRetorno = "El usuario no se encuentra activo: " + usuario;
				}
				else if (!StringUtils.equals(clave, pgrUsuario.getClave())) {
					codigoRetorno = "11";
					mensajeRetorno = "La clave proporcionada es incorrecta";
				}
				else {
					pgrConsultaCliente = getHibernateDao().obtenerConsultaClientePorDui(dui);
					if (pgrConsultaCliente == null) {
						codigoRetorno = "12";
						mensajeRetorno = "No se encontraron registros asociados al documento proporcionado: " + dui;
					}
					else {
						codigoRetorno = StringUtils.equals("1", pgrConsultaCliente.getSolvente()) ? "00" : "01";
						mensajeRetorno = "Consulta realizada exit\u00f3samente";
						estado = StringUtils.equals("00", codigoRetorno) ? "SOLVENTE" : "MOROSO";
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			codigoRetorno = "02";
			mensajeRetorno = "Error ejecutando transacci\u00f3n";
		}
		salida.setCodigoRetorno(codigoRetorno);
		salida.setMensajeRetorno(mensajeRetorno);
		salida.setEstado(estado);
		String xml = PGRUtil.generarXml(salida);
		try {
			PgrBitacoraConsulta pgrBitacoraConsulta = new PgrBitacoraConsulta();
			pgrBitacoraConsulta.setFechaConsulta(new Date());
			pgrBitacoraConsulta.setRespuesta(xml);
			pgrBitacoraConsulta.setPgrUsuario(pgrUsuario);
			pgrBitacoraConsulta.setPgrConsultaCliente(pgrConsultaCliente);
			getHibernateDao().insertar(pgrBitacoraConsulta);
		} catch (Exception e) {
			System.err.println("Error al guardar registros en bit\u00e1cora: " + e.getMessage());
			e.printStackTrace();
		}
		return xml;
	}

	@Override
	public String comprobarSolvenciaDuiNombres(String usuario, String clave, String dui, String primerNombre, String segundoNombre, String primerApellido, String segundoApellido, String apellidoCasada) {
		return null;
	}

}
